package br.com.equus.entidade;

import static javax.persistence.GenerationType.IDENTITY;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.envers.Audited;

import br.com.arquitetura.entidade.Entidade;
import br.com.arquitetura.util.DateUtil;

@Entity
@Table(name = "EQ_MANEJO_ANIMAL", catalog = "EQUUS")
@Audited
public class ManejoAnimal extends Entidade<Integer> {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "ID_MANEJO_ANIMAL", unique = true, nullable = false)
	private Integer id;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_ANIMAL", referencedColumnName = "ID_ANIMAL", nullable = false)
	private Animal animal;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_USUARIO_AVALIADOR", referencedColumnName = "ID_USUARIO", nullable = false)
	private Usuario usuarioAvaliador;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "USUARIO_EXECUTOR", referencedColumnName = "ID_USUARIO", nullable = false)
	private Usuario usuarioExecutor;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_TAREFA", referencedColumnName = "ID_TAREFA", nullable = false)
	private TipoTarefa tipoTarefa;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DT_INICIO", nullable = false)
	private Date dtInicio;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DT_TERMINO", nullable = false)
	private Date dtFim;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DT_CRIACAO", nullable = false)
	private Date dtCriacao;

	@Column(name = "DSC_OBSERVACAO", columnDefinition = "text")
	private String observacao;

	@OneToMany(mappedBy = "manejoAnimal", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	private List<ManejoProduto> manejoProdutos = new ArrayList<ManejoProduto>();

	@OneToMany(mappedBy = "manejoAnimal", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	private List<StatusManejo> statusManejo = new ArrayList<StatusManejo>();

	@Transient
	private List<ManejoProduto> manejoProdutosExcluir = new ArrayList<ManejoProduto>();

	@Transient
	private StatusManejo statusAtual;

	@Transient
	private String dtInicioString;
	@Transient
	private String dtCriacaoString;

	@Transient
	private String dtFimString;

	public ManejoAnimal() {
		// TODO Auto-generated constructor stub
	}

	public ManejoAnimal(Integer id) {
		this.id = id;
	}

	public Object clone() {
		Object newObject = null;
		try {
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(this);
			ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
			newObject = ois.readObject();
			ois.close();
			oos.close();
			baos.close();
		} catch (IOException ioe) {
		} catch (ClassNotFoundException cnfe) {
		}
		return newObject;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Animal getAnimal() {
		return animal;
	}

	public void setAnimal(Animal animal) {
		this.animal = animal;
	}

	public Usuario getUsuarioExecutor() {
		return usuarioExecutor;
	}

	public void setUsuarioExecutor(Usuario usuarioExecutor) {
		this.usuarioExecutor = usuarioExecutor;
	}

	public TipoTarefa getTipoTarefa() {
		return tipoTarefa;
	}

	public void setTipoTarefa(TipoTarefa tipoTarefa) {
		this.tipoTarefa = tipoTarefa;
	}

	public Date getDtInicio() {
		return dtInicio;
	}

	public void setDtInicio(Date dtInicio) {
		this.dtInicio = dtInicio;
	}

	public Date getDtFim() {
		return dtFim;
	}

	public void setDtFim(Date dtFim) {
		this.dtFim = dtFim;
	}

	public String getObservacao() {
		return observacao;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public List<ManejoProduto> getManejoProdutos() {
		return manejoProdutos;
	}

	public void setManejoProdutos(List<ManejoProduto> manejoProdutos) {
		this.manejoProdutos = manejoProdutos;
	}

	public List<ManejoProduto> getManejoProdutosExcluir() {
		return manejoProdutosExcluir;
	}

	public void setManejoProdutosExcluir(List<ManejoProduto> manejoProdutosExcluir) {
		this.manejoProdutosExcluir = manejoProdutosExcluir;
	}

	public Date getDtCriacao() {
		return dtCriacao;
	}

	public void setDtCriacao(Date dtCriacao) {
		this.dtCriacao = dtCriacao;
	}

	public StatusManejo getStatusAtual() {
		if (statusManejo != null && !statusManejo.isEmpty()) {
			Collections.sort(statusManejo, new Comparator<StatusManejo>() {
				@Override
				public int compare(StatusManejo o1, StatusManejo o2) {
					return o1.getId().compareTo(o2.getId());
				}
			});
			statusAtual = statusManejo.get(statusManejo.size() - 1);

		}
		return statusAtual;
	}

	public void setStatusAtual(StatusManejo statusAtual) {
		this.statusAtual = statusAtual;
	}

	public List<StatusManejo> getStatusManejo() {
		return statusManejo;
	}

	public void setStatusManejo(List<StatusManejo> statusManejo) {
		this.statusManejo = statusManejo;
	}

	public String getDtCriacaoString() {
		if (dtCriacao != null) {
			dtCriacaoString = DateUtil.getDataHora(dtCriacao, "dd/MM/yyyy HH:mm");
		}
		return dtCriacaoString;
	}

	public void setDtCriacaoString(String dtCriacaoString) {
		this.dtCriacaoString = dtCriacaoString;
	}

	public String getDtFimString() {
		if (dtFim != null) {
			dtFimString = DateUtil.getDataHora(dtFim, "dd/MM/yyyy HH:mm");
		}
		return dtFimString;
	}

	public void setDtFimString(String dtFimString) {
		this.dtFimString = dtFimString;
	}

	public String getDtInicioString() {
		if (dtInicio != null) {
			dtInicioString = DateUtil.getDataHora(dtInicio, "dd/MM/yyyy HH:mm");
		}
		return dtInicioString;
	}

	public void setDtInicioString(String dtInicioString) {
		this.dtInicioString = dtInicioString;
	}

	public Usuario getUsuarioAvaliador() {
		return usuarioAvaliador;
	}

	public void setUsuarioAvaliador(Usuario usuarioAvaliador) {
		this.usuarioAvaliador = usuarioAvaliador;
	}

}
